在android中使用openID登录steam

Posted

技术标签:

【中文标题】在android中使用openID登录steam【英文标题】:steam login using openID in android 【发布时间】:2015-07-04 14:51:47 【问题描述】:

我是 android 开发的新手。我的项目是使用 Steam 公共 API 制作应用程序,但我不知道如何允许用户使用 Steam 帐户登录。

Steam 的 web API 文档声明我应该使用 openID,所以我搜索了很多以找到一个在 Andorid 应用程序中实现 openID 的示例,但 this 是我找到的唯一示例并且它不起作用,webView 只是转动空白。

我只想让用户点击一个登录按钮,该按钮会触发一个 webView,用户可以在其中登录,然后取回他的 Steam ID。

所以我的问题是

    有没有办法在android中实现openID登录? 如果没有,是否有允许用户登录steam?

【问题讨论】:

请提供更多关于你工作的细节>>> 【参考方案1】:

我想我发现了某种解决方法。

steam openid 可以与这样的 url 请求一起使用:

https://steamcommunity.com/openid/login?
openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&
openid.identity=http://specs.openid.net/auth/2.0/identifier_select&
openid.mode=checkid_setup&
openid.ns=http://specs.openid.net/auth/2.0&
openid.realm=https://REALM_PARAM&
openid.return_to=https://REALM_PARAM/signin/

其中 REALM_PARAM 是将出现在登录屏幕上的网站,并且用户将在身份验证完成后被重定向到该网站,它不必实际存在。 之后您所要做的就是解析用户 ID 的新 url。

所以我用了这样的东西

public class LoginActivity extends ActionBarActivity 

    // The string will appear to the user in the login screen  
    // you can put your app's name
    final String REALM_PARAM = "YourAppName";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        final WebView webView = new WebView(this);
        webView.getSettings().setjavascriptEnabled(true);

        final Activity activity = this;

        webView.setWebViewClient(new WebViewClient() 
            @Override
            public void onPageStarted(WebView view, String url,
                                      Bitmap favicon) 

                //checks the url being loaded
                setTitle(url);
                Uri Url = Uri.parse(url);

                if(Url.getAuthority().equals(REALM_PARAM.toLowerCase()))
                    // That means that authentication is finished and the url contains user's id.
                    webView.stopLoading();

                    // Extracts user id.
                    Uri userAccountUrl = Uri.parse(Url.getQueryParameter("openid.identity"));
                    String userId = userAccountUrl.getLastPathSegment();

                    // Do whatever you want with the user's steam id 

                );
                setContentView(webView);

                // Constructing openid url request
                String url = "https://steamcommunity.com/openid/login?" +
                        "openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&" +
                        "openid.identity=http://specs.openid.net/auth/2.0/identifier_select&" +
                        "openid.mode=checkid_setup&" +
                        "openid.ns=http://specs.openid.net/auth/2.0&" +
                        "openid.realm=https://" + REALM_PARAM + "&" +
                        "openid.return_to=https://" + REALM_PARAM + "/signin/";

                webView.loadUrl(url);

            
        

【讨论】:

节省了我的一天,先生!你应该得到金牌。【参考方案2】:

form标签中使用纯HTML

通过这种方式,您可以覆盖 Android 设备以及使用 html 的所有内容。这样就实现了官方Steam documentation中描述的登录。

    <form action="https://steamcommunity.com/openid/login" method="post">
        <input type="hidden" name="openid.identity"
               value="http://specs.openid.net/auth/2.0/identifier_select" />
        <input type="hidden" name="openid.claimed_id"
               value="http://specs.openid.net/auth/2.0/identifier_select" />
        <input type="hidden" name="openid.ns" value="http://specs.openid.net/auth/2.0" />
        <input type="hidden" name="openid.mode" value="checkid_setup" />
        <input type="hidden" name="openid.realm" value="https:\\yourOpenIdRealm.com" />
        <input type="hidden" name="openid.return_to" value="https:\\YourDomainUrlToReturnTo.com" />
        <Button type="submit">Log in through Steam</Button>
    </form>
用户将在您的站点上单击此表单中的按钮,并将重定向到 Steam 社区登录页面。 然后用户可以在 Steam 社区页面上登录他们的 Steam 帐户。 使用YourDomainUrlToReturnTo,您可以指定用户在通过 Steam 成功登录后返回您网站的位置。 Steam 将在浏览器的location object 中提供 Steam ID。 使用该 Steam ID,您可以通过 Steam Web API 获取用户信息。

【讨论】:

【参考方案3】:

我更正了@LibBo 的代码。有一些语法错误。还将ActionBarActivity 更新为AppCompatActivity

public class SteamActivity extends AppCompatActivity 

    // The string will appear to the user in the login screen
    // you can put your app's name
    final String REALM_PARAM = "YourAppName";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_steam);


        final WebView webView = new WebView(this);
        webView.getSettings().setJavaScriptEnabled(true);

        final Activity activity = this;

        setContentView(webView);

        // Constructing openid url request
        String url = "https://steamcommunity.com/openid/login?" +
                "openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&" +
                "openid.identity=http://specs.openid.net/auth/2.0/identifier_select&" +
                "openid.mode=checkid_setup&" +
                "openid.ns=http://specs.openid.net/auth/2.0&" +
                "openid.realm=https://" + REALM_PARAM + "&" +
                "openid.return_to=https://" + REALM_PARAM + "/signin/";

        webView.loadUrl(url);

        webView.setWebViewClient(new WebViewClient() 
            @Override
            public void onPageStarted(WebView view, String url,
                                      Bitmap favicon) 

                //checks the url being loaded
                setTitle(url);
                Uri Url = Uri.parse(url);

                if (Url.getAuthority().equals(REALM_PARAM.toLowerCase())) 
                    // That means that authentication is finished and the url contains user's id.
                    webView.stopLoading();

                    // Extracts user id.
                    Uri userAccountUrl = Uri.parse(Url.getQueryParameter("openid.identity"));
                    String userId = userAccountUrl.getLastPathSegment();

                    // Do whatever you want with the user's steam id

                
            
        );
    

【讨论】:

以上是关于在android中使用openID登录steam的主要内容,如果未能解决你的问题,请参考以下文章

Android 之微信登录

使用Django实现微信公众号用户openid登录认证

OpenId + 记住我/保持登录状态

Google OpenID/联合登录定期失败

使用 OpenID 作为我网站的登录名 - 冗余提供商

openID 用例